package com.idanchuang.component.pushgateway.test;

import com.idanchuang.component.pushgateway.Pusher;
import io.prometheus.client.Gauge;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.net.InetAddress;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

/**
 *
 * Gauge指标
 *
 * @author yjy
 * @date 2020/4/13 15:19
 **/
@Component
public class GaugeRunner implements CommandLineRunner {

    // Gauge: 仪表盘, Guage 类型代表一种样本数据可以任意变化的指标，即可增可减。guage 通常用于像温度或者内存使用率这种指标数据，也可以表示能随时增加或减少的“总数”，例如：当前并发请求的数量
    private final static Gauge SAMPLE_GAUGE = Gauge.build()
            // 填写指标名称 (字母/数字/下划线)
            .name("sample_gauge_index")
            // 设置自定义指标维度, 如: 应用, 实例, 响应码
            .labelNames("app", "http_code")
            // 指标说明
            .help("这里填写指标说明")
            .create();

    @Autowired
    private Pusher pusher;

    @Override
    public void run(String... args) throws Exception {
        // 上报 gauge 类型的指标
        pushGauge("test_app", "200", new Random().nextInt(400), "sample_job");
    }

    /**
     * 上报 gauge 指标
     * @param app 应用
     * @param httpCode 状态码
     * @param value 当前值
     * @param job 工作组
     */
    private void pushGauge(String app, String httpCode, double value, String job) throws IOException {
        SAMPLE_GAUGE.labels(app, httpCode).inc(value);
        // groupingKey: 如果应用为集群部署, 则必须指定应用实例信息, 否则某一个应用重启后, 会将整个集群的指标重置
        Map<String, String> groupingKey = new HashMap<>();
        groupingKey.put("instance", InetAddress.getLocalHost().getHostAddress());
        pusher.pushAdd(SAMPLE_GAUGE, job, groupingKey);
    }

}
